package com.dog.basics.service.sys.impl;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Validator;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dog.basics.bean.dto.admin.sys.SysConfigAddDto;
import com.dog.basics.bean.dto.admin.sys.SysConfigDto;
import com.dog.basics.bean.dto.admin.sys.SysConfigEditDto;
import com.dog.basics.bean.model.sys.SysConfig;
import com.dog.basics.bean.vo.admin.sys.SysConfigPageVo;
import com.dog.basics.bean.vo.api.sys.AboutUsVo;
import com.dog.basics.common.util.R;
import com.dog.basics.dao.sys.SysConfigMapper;
import com.dog.basics.service.sys.ISysConfigService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.stream.Collectors;


/**
 * <p>
 * 系统配置信息表 服务实现类
 * </p>
 *
 * @author guoy
 * @since 2020-03-19
 */
@Service
@AllArgsConstructor
public class SysConfigServiceImpl extends ServiceImpl<SysConfigMapper, SysConfig> implements ISysConfigService {

    private final SysConfigMapper sysConfigMapper;

    /**
     * 配置列表
     *
     * @param page
     * @param sysConfigDto
     * @return
     * @author fengjukang
     */
    @Override
    public IPage<SysConfigPageVo> getSysConfigPage(Page page, SysConfigDto sysConfigDto) {
        IPage iPage = this.page(page, new LambdaQueryWrapper<SysConfig>()
                .like(StrUtil.isNotBlank(sysConfigDto.getCode()), SysConfig::getCode, sysConfigDto.getCode()));
        List<SysConfig> records = iPage.getRecords();
        iPage.setRecords(records.stream().map(SysConfig -> {
            SysConfigPageVo sysConfigPageVo = new SysConfigPageVo();
            BeanUtil.copyProperties(SysConfig, sysConfigPageVo);
            return sysConfigPageVo;
        }).collect(Collectors.toList()));
        return iPage;
    }
    /**
     * api获取配置信息
     *
     * @param code
     * @return SysConfigPageVo
     * @author fengjukang
     */
    @Override
    public AboutUsVo getApiSysConfig(String code) {
        List<SysConfig> list = this.list(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getCode, code).orderByDesc(SysConfig::getCreateTime));
        Validator.validateTrue(CollUtil.isNotEmpty(list), "关于我们为空!");
        AboutUsVo aboutUsVo = new AboutUsVo();
        BeanUtil.copyProperties(list.get(0), aboutUsVo);
        return aboutUsVo;
    }

    /**
     * 保存配置信息
     *
     * @param sysConfigDto
     * @return
     * @author wph
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean saveSysConfigDto(SysConfigAddDto sysConfigDto) {
        SysConfig sysConfig = new SysConfig();

        BeanUtil.copyProperties(sysConfigDto, sysConfig);
        return this.save(sysConfig);
    }

    /**
     * 修改配置信息
     *
     * @param sysConfigDto
     * @return
     * @author wph
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean updateSysConfigDto(SysConfigEditDto sysConfigDto) {

        SysConfig sysConfig = this.getById(sysConfigDto.getId());
        BeanUtil.copyProperties(sysConfigDto, sysConfig);

        return this.updateById(sysConfig);
    }

    /**
     * 删除配置信息
     *
     * @param ids 配置项id列表
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void deleteSysConfigDto(Long[] ids) {

        sysConfigMapper.deleteBatch(ids);
/*        for (Long id : ids) {

            this.deleteSysConfigDtoId(this.getById(id).getCode());
        }*/
    }

   /* @CacheEvict(beforeInvocation = true, cacheNames = {"config"}, key = "#code")
    public void deleteSysConfigDtoId(String code) {

    }*/
}

